/*Description
设计并实现一个扑克牌类Card，表示一幅纸牌，要求：
（1）用数组表示除大小王外的一幅纸牌共52张，每张纸牌有花色和点数，花色分为4种，
分别对应黑桃(Spade: S)、红桃(Heart: H)、方片(Diamond: D)和梅花(Club: C)，
如黑桃A简记为SA，梅花6简记为C6；
（2）读入随机洗好的52张牌；
（3）支持从洗好的牌中按位置抽取某一张牌的操作pick()；
（4）支持计算每张纸牌分数的操作getScore()，
“J”、“Q”、“K”、“A”分别对应分值10、10、10、11，其它“2~10”分值对应其字面点数。
编写测试程序，模拟两个玩家交错抽取5张牌，显示双方的花色和点数，并根据总分值判断输赢。
Input
随机洗好的52张牌花色及点数，玩家1抽取牌的序号，玩家2抽取牌的序号。
Output
显示双方5张牌的花色、点数和总分值，两个玩家的输赢结果，如果玩家1赢得比赛，输出“Player 1 wins!”，如果玩家2赢得比赛，输出“Player 2 wins!”，如果平局，输出“Draw!”。
*/

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <algorithm>
using namespace std;

class Card {
private:
    string suit;  // 花色
    string rank;  // 点数

public:
    // 构造函数
    Card(string suit, string rank) : suit(suit), rank(rank) {}

    // 获取花色
    string getSuit() const {
        return suit;
    }

    // 获取点数
    string getRank() const {
        return rank;
    }

    // 计算分数
    int getScore() const {
        if (rank == "J" || rank == "Q" || rank == "K") {
            return 10; // J、Q、K 的分值为 10
        } else if (rank == "A") {
            return 11; // A 的分值为 11
        } else {
            try {
                return stoi(rank); // 将数字字符串转换为整数
            } catch (const invalid_argument&) {
                cerr << "Error: Invalid rank value!" << endl;
                return 0;
            }
        }
    }

    // 打印卡片信息
    string toString() const {
        return suit + rank;
    }
};

// 生成一副扑克牌//看不懂？？？
vector<Card> generateDeck() {
    vector<string> suits = {"S", "H", "D", "C"};  // 黑桃、红桃、方片、梅花
    vector<string> ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
    vector<Card> deck;//deck是一个vector<Card>类型的容器

    for (const string& suit : suits) {
        for (const string& rank : ranks) {
            deck.emplace_back(suit, rank);//调用构造函数Card(string ,string)
        }
    }

    return deck;//返回容器
}

// 随机洗牌
void shuffleDeck(vector<Card>& deck) {
    srand(static_cast<unsigned>(time(0)));//设置随机数种子
    random_shuffle(deck.begin(), deck.end());
}  //random_shuffle是标准库中的算法，用于打乱容器中元素的顺序

// 从牌堆中抽取一张牌
Card pickCard(vector<Card>& deck, int position) {
    if (position < 0 || position >= deck.size()) {
        cerr << "Error: Invalid card position!" << endl;
        exit(1); // 终止程序
    }
    return deck[position];
}

int main() {
    // 生成并洗牌
    vector<Card> deck = generateDeck();//生成一副扑克牌
    shuffleDeck(deck);//打乱

    // 玩家1和玩家2的分数
    int player1Score = 0, player2Score = 0;

    // 玩家1和玩家2的牌
    vector<Card> player1Cards, player2Cards;

    // 模拟交替抽取5张牌
    cout << "请输入玩家1和玩家2抽取牌的序号（0-51）：" << endl;
    for (int i = 0; i < 5; ++i) {
        int pos1, pos2;
        cout << "第 " << i + 1 << " 轮：" << endl;
        cout << "玩家1输入牌序号：";
        cin >> pos1;
        cout << "玩家2输入牌序号：";
        cin >> pos2;

        // 验证输入的序号是否有效
        if (pos1 < 0 || pos1 >= 52 || pos2 < 0 || pos2 >= 52) {
            cerr << "Error: 输入的牌序号无效！请确保在 0 到 51 之间。" << endl;
            return 1;
        }

        Card card1 = pickCard(deck, pos1);
        Card card2 = pickCard(deck, pos2);

        player1Cards.push_back(card1);
        player2Cards.push_back(card2);

        player1Score += card1.getScore();
        player2Score += card2.getScore();
    }

    // 输出玩家1的牌
    cout << "Player 1's cards: ";
    for (const Card& card : player1Cards) {
        cout << card.toString() << " ";
    }
    cout << "\nPlayer 1's total score: " << player1Score << endl;

    // 输出玩家2的牌
    cout << "Player 2's cards: ";
    for (const Card& card : player2Cards) {
        cout << card.toString() << " ";
    }
    cout << "\nPlayer 2's total score: " << player2Score << endl;

    // 判断输赢
    if (player1Score > player2Score) {
        cout << "Player 1 wins!" << endl;
    } else if (player1Score < player2Score) {
        cout << "Player 2 wins!" << endl;
    } else {
        cout << "Draw!" << endl;
    }

    return 0;
}
